ABSTRACT

The Philadelphia water department (PWD) has been actively monitoring flow data at over 400 sites over Philadelphia since the 2000s. Data is collected twice a month through contractors. Due to the high solid content in sewage, flow data at sewer pipes (level, velocity) suffered from breakouts (mean shift, ramp up) over the time due to sensor ragging, pipe clogging, etc. A stringent Quality Control (QC) protocol is conducted before the data can be used for Hydrologic & Hydraulic modeling tasks. As one QC measure, the water level and velocity are examined to detect any potential breakout.

Since flow data fluctuates with rainfall-runoff events, the breakout detection algorithm must be robust to avoid the interference of runoff responses. Several breakout detection techniques were compared, and the E-Divisive with Medians (EDM) algorithm is adopted in this study. EDM recursively partitions a time series and uses a permutation test to determine change points. The EDM has following advantages: 1. EDM uses moving median as opposed to the mean, which is robust to the presence of anomalies; 2. EDM can detect both ‘mean shift’ (sudden change) and ‘ramping’ (gradual change) for multiple change points; 3. EDM takes a non-parametric approach, meaning the model will adapt to the data’s underlying distribution, and therefore can detect distribution change; 4. EDM is fast, as it uses interval trees to efficiently approximate the median.

The analysis is implemented in a program written in R, and the EDM algorithm is implemented via the ‘BreakoutDetection’ package developed by Twitter engineers. Non-trivial parameters of the EDM model are carefully tuned to best match the expected outcome. This analysis provides an additional assurance to the data quality. Also, field crews (monitoring, Operation & Maintenance, etc.) can quickly respond to the issue once a breakout has been detected. This analysis is also applicable for other monitored data, such as the trunk and outfall levels at drainage system regulators.

1 BACKGROUND

The Philadelphia Water Department (PWD) maintains hydrologic and hydraulic models of the combined sewer collection system for planning, management and compliance purposes. PWD relies on these models to evaluate the effectiveness of existing and proposed CSO control measures. Efforts are being made to refine the models and improve their accuracy as the program progresses from planning to implementation phases. Since the 2000s, PWD has been monitoring the sewerage level and velocity at over 400 manholes across the city for various model calibration/validation tasks. Data are measured at 15-minute interval, which are collected bi-weekly by contractor.

Due to the high solid content in sewage, level and velocity measurements at sewer pipes may suffered from breakouts (mean shift, ramp up) over the time due to sensor ragging, clogging, or pipe surcharging, etc. A stringent Quality Control (QC) protocol is conducted before the data can be used for Hydrologic & Hydraulic modeling tasks. As one QC measure, the water level and velocity time-series are examined to detect any potential breakout. Since a breakout isn’t always obvious due to the range of the observed values, visual detection of breakouts may not be sufficient, and thus a programmatic approach that can automatically detect breakouts is imperative.

Since flow data at sewer pipes fluctuates with rainfall-runoff events, the runoff response may interfere the breakout detection. Therefore, the algorithm must be robust against the presence of anomalies.

Also, field crews (monitoring, Operation & Maintenance, etc.) can quickly respond to the issue once a breakout has been detected. This analysis is also applicable for other monitored data, such as the trunk and outfall levels at drainage system regulators.

2 OBJECTIVES

Measurement Accuracy determines the overall model quality. This study aims to develop a workflow as a QA measure for detecting breakouts in flow monitoring data utilizing a sound change point detection algorithm. First, a sound breakout detection algorithm is selected from several state-of-art methods, where it must met the following requirements:

Next, the algorithm parameters are carefully tuned to optimize the outcome.

Finally, an application is developed in the R statistical programming language for analyzing the level and velocity time-series and generating a quarterly report, which is executed biweekly automatically.

3 METHODOLOGY

3.1 Change point analysis

In statistics, the ‘breakout detection’ belongs to the change point analysis, which has been widely researched over the past 50 years in a wide variety of fields, such as finance (Edwards et al 2012), genetics (Chen and Gupta 2011), and signal processing (Basseville 1988). As we’ve entered the ‘Big Data’ era, it has gain it’s popularity in low latency, high reliability online analytics for cloud data (James, et al. 2016).

A breakout is typically characterized by two steady states and an intermediate transition period. Mathematically, for data z1,…,zn, if a changepoint exists at τ, then z1,…,zτ differ from zτ+1,…,zn in some way.

There are many different types of change, such as Mean shift, which is a sudden jump in the time series; Ramp up/down, which is a gradual change in the value of the metric from one steady state to another; distribution change, which is a change of the data distribution.

Change point analysis mainly answers the following questions:

  • does a change point exists?

  • when does the change point happen?

  • what is the significance of the change point?

  • how sure is the change point?

Numerous changepoint detection algorithms have been widely researched in various fields of industries (Rodionov 2005).

Depending on the data distribution assumption, a breakout detection algorithm generally falls into two categories:

  • parametric: The parametric analysis assumes that the observed distributions belong to a family of distributions. Common parametric methods are PELT (Killick et al, 2012), …,

  • non-parametric: do not make assumption on data distribution and use density estimation instead. non-parametric methods (Pohlert 2018), such as E-divisive (Matteson & James 2012), …

Based on its application, a breakout detection can be designed for

  • online analytics: the data is streaming into the model;

  • offline analytics: the data are processed in batches.

Several R packages already exists for breakout detection, e.g., [R packages introduction] — ecp, cpm, changepoint, reakoutDetection, etc. - ecp: e-divisive, e-agglometric

  • cpm

  • changepoint (Killick & Eckley, 2014)

  • BreakoutDetection: EDM

Many of the existing techniques have limitation in analyzing flow data due to the fact that they are not robust in the presence of anomalies, and may not suitable for this study.

3.2 E-divisive with medians (EDM)

EDM is a novel statistical technique that employs energy statistics (E-divisive) to detect divergence of means. To be robust against the presence of anomalies, EDM uses the rolling median as a local smoother to the raw data. In addition, EDM is capable of detecting multiple change points.

Energy statistics compares the distances of means of two random variables contained within a larger time series. The e-divisive method recursively partitions a time series and uses a permutation test to determine change points, but it is computationally intensive. To overcome this, EDM uses interval trees to efficiently approximate the median, and therefore is much faster than E-Divisive.

EDM can detect various types of change, including ‘mean shift’ (sudden change) , ‘ramping’ (gradual change), and change in distributions. since EDM is non-parametric, it doesn’t make any assumption about the distribution of the time-series, instead, it learn the current distribution as a reference. When the distribution suddenly change EDM can detect the variation; This is important since the distribution of production data seldom (if at all) follows the commonly assumed normal distribution or any other widely accepted model.

A comparsion (ref) shows that EDM outperformed the PELT in the majority of data sets. Due to the weaker assumption in EDM, The significance of the breakout is determined by permutation test, where data from the two time series are permutated a finite number of times, and hence the EDM takes longer to execute than the PELT. However, the EDM has shown a comparable efficacy than other change point analysis algorithms. According to xxxx (2016), EDM is 3.5x faster than the other popular algorithms.

3.3 BreakoutDetection package in R

The EDM algorithm is implemented by the BreakoutDetection, which is an open-source R package developed by Twitter Engineers and has been used for analyzing network breakouts on a daily basis at Twitter.

The breakout() is the detector function, which contains the following parameters:

Z: The input time series. This is either a numeric vector or a data.frame which has ‘timestamp’ and ‘count’ components. min.size: The minimum number of observations between change points. method: either ‘amoc’ (At Most One Change) or ‘multi’ (Multiple Changes). For ‘amoc’ at most one change point location will be returned.

for single change point (method=‘amoc’):

alpha: The alpha parameter used to weight the distance between observations. This is a real number in the interval (0,2]. The default value is alpha=2.

exact: This flag is for selecting the use of true medians (TRUE) or approximate medians (FALSE) when determining change points. The default value is exact=TRUE.

sig.lvl: Once a change point is found its statistical significance is determined through a hypothesis test. sig.lvl specifies the significance for the hypothesis test. The default value is sig.lvl=0.05.

nperm: The number of permutations to perform in order to obtain an approximate p-value. If nperm=0 then then permutation test is not performed. The default value is nperm=0.

For multiple change analysis (method=’multi“):

degree: The degree of the penalization polynomial. degree can take the values 0, 1, and 2. The default value is degree=1.

beta: A real numbered constant used to further control the amount of penalization. This is the default form of penalization, if neither (or both) beta or (and) percent are supplied this argument will be used. The default value is beta=0.008.

percent: A real numbered constant used to further control the amount of penalization. This value specifies the minimum percent change in the goodness of fit statistic to consider adding an additional change point. A value of 0.25 corresponds to a 25% increase. percent doesn’t have a default value.

RESULTS

After a thorough literature review and testing with sample data, the E-Divisive with Medians (EDM) algorithm is adopted in this study.

Based on a series of tests using sample data, the breakout() function arguments are determined:

A R markdown document is developed that includes scripts for breakout detection, summarize the results, and plot breakouts with time-series for multiple sites. To improve the performance, parallel computation is utilized. The output is a quarterly report that includes a summary table of breakouts, and hydrographs for all sites with hyetograph overlaid. The report is automatically updated bi-weekly when data is updated. In the future, it’s expected to be updated more frequently when real-time data becomes available.

A few breakout examples based on real data are shown in Fig.xxx. a) shows an positive change in level and a negative change in velocity near August 1, 2017, and it resets to its original values near August 22, 2017. This is typically caused by pipe surcharging.

b) shows a sudden downward shift on November 11, 2014. The opposite trend is observed in the level data, but the breakout was not detected somehow.

  1. flushing effect?

limitation:

CONCLUSIONS

EDM is proven to be a reliable, effective, and efficient breakouts detection technique for flow monitoring data (level & velocity) with properly tuned parameters. This method is expected to be applicable for other monitiored time-series data, such as outfall levels at CSO regulators.

In this study, A R application that utilizes EDM for breakout detection is developed. This analysis provides a quality control to the modeling data, which would be beneficial for improving the model quality, and quickly respond to field issues. This analysis is also applicable for other monitored data, such as the trunk and outfall levels at drainage system regulators.

REFERENCE

James, Nicholas A., Arun Kejariwal, and David S. Matteson. “Leveraging cloud data to mitigate user experience from ‘Breaking Bad’: The Twitter Approach.” In Big Data (Big Data), 2016 IEEE International Conference on, pp. 3499-3508. IEEE, 2016.

Matteson, David S., and James, Nicholas A. “A nonparametric approach for multiple change point analysis of multivariate data.” Journal of the American Statistical Association 109, no. 505 (2014): 334-345.

James, Nicholas A., and David S. Matteson. “ecp: An R package for nonparametric multiple change point analysis of multivariate data.” arXiv preprint arXiv:1309.3295 (2013).

Edwards, Robert D., Magee, John, and Bassetti, W.H.C.. “Technical analysis of stock trends”. CRC Press, 2012

Jie Chen and Arjun K Gupta. Parametric Statistical Change Point Analysis: With Applications to Genetics, Medicine, and Finance. Springer, 2011.

Michèle Basseville. Detecting changes in signals and systemsa survey. Automatica, 24(3):309–326, 1988

Killick, Rebecca, and Idris Eckley. “changepoint: An R package for changepoint analysis.” Journal of statistical software 58, no. 3 (2014): 1-19

Rebecca Killick, Paul Fearnhead, and IA Eckley. Optimal detection of changepoints with a linear computational cost. Journal of the American Statistical Association, 107(500):1590–1598, 2012

Rodionov, S. N. “A brief overview of the regime shift detection methods.” Large-scale disturbances (regime shifts) and recovery in aquatic ecosystems: challenges for management toward sustainability (2005): 17-24.

Pohlert, Thorsten. “Non-parametric trend tests and change-point detection.” CC BY-ND 4 (2018).

LS0tDQp0aXRsZTogJ0JyZWFraW5nIEJhZDogcm9idXN0IEJyZWFrb3V0IGRldGVjdGlvbiBiYXNlZCBvbiBFLURpdmlzaXZlIHdpdGggTWVkaWFucyAoRURNKQ0KICBmb3IgbW9kZWxpbmcgZGF0YSBxdWFsaXR5IGNvbnRyb2wnDQphdXRob3I6ICJIYW8gWmhhbmciDQpkYXRlOiAiRmVidXJhcnkgMjMsIDIwMTgiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgICBmaWdfY2FwdGlvbjogeWVzDQotLS0NCg0KPGNlbnRlcj48aDM+QUJTVFJBQ1Q8L2gzPjwvY2VudGVyPg0KDQpUaGUgUGhpbGFkZWxwaGlhIHdhdGVyIGRlcGFydG1lbnQgKFBXRCkgaGFzIGJlZW4gYWN0aXZlbHkgbW9uaXRvcmluZyBmbG93IGRhdGEgYXQgb3ZlciA0MDAgc2l0ZXMgb3ZlciBQaGlsYWRlbHBoaWEgc2luY2UgdGhlIDIwMDBzLiBEYXRhIGlzIGNvbGxlY3RlZCB0d2ljZSBhIG1vbnRoIHRocm91Z2ggY29udHJhY3RvcnMuIER1ZSB0byB0aGUgaGlnaCBzb2xpZCBjb250ZW50IGluIHNld2FnZSwgZmxvdyBkYXRhIGF0IHNld2VyIHBpcGVzIChsZXZlbCwgdmVsb2NpdHkpIHN1ZmZlcmVkIGZyb20gYnJlYWtvdXRzIChtZWFuIHNoaWZ0LCByYW1wIHVwKSBvdmVyIHRoZSB0aW1lIGR1ZSB0byBzZW5zb3IgcmFnZ2luZywgcGlwZSBjbG9nZ2luZywgZXRjLiBBIHN0cmluZ2VudCBRdWFsaXR5IENvbnRyb2wgKFFDKSBwcm90b2NvbCBpcyBjb25kdWN0ZWQgYmVmb3JlIHRoZSBkYXRhIGNhbiBiZSB1c2VkIGZvciBIeWRyb2xvZ2ljICYgSHlkcmF1bGljIG1vZGVsaW5nIHRhc2tzLiBBcyBvbmUgUUMgbWVhc3VyZSwgdGhlIHdhdGVyIGxldmVsIGFuZCB2ZWxvY2l0eSBhcmUgZXhhbWluZWQgdG8gZGV0ZWN0IGFueSBwb3RlbnRpYWwgYnJlYWtvdXQuIA0KDQpTaW5jZSBmbG93IGRhdGEgZmx1Y3R1YXRlcyB3aXRoIHJhaW5mYWxsLXJ1bm9mZiBldmVudHMsIHRoZSBicmVha291dCBkZXRlY3Rpb24gYWxnb3JpdGhtIG11c3QgYmUgcm9idXN0IHRvIGF2b2lkIHRoZSBpbnRlcmZlcmVuY2Ugb2YgcnVub2ZmIHJlc3BvbnNlcy4gU2V2ZXJhbCBicmVha291dCBkZXRlY3Rpb24gdGVjaG5pcXVlcyB3ZXJlIGNvbXBhcmVkLCBhbmQgdGhlIEUtRGl2aXNpdmUgd2l0aCBNZWRpYW5zIChFRE0pIGFsZ29yaXRobSBpcyBhZG9wdGVkIGluIHRoaXMgc3R1ZHkuIEVETSByZWN1cnNpdmVseSBwYXJ0aXRpb25zIGEgdGltZSBzZXJpZXMgYW5kIHVzZXMgYSBwZXJtdXRhdGlvbiB0ZXN0IHRvIGRldGVybWluZSBjaGFuZ2UgcG9pbnRzLiBUaGUgRURNIGhhcyBmb2xsb3dpbmcgYWR2YW50YWdlczogDQoxLiBFRE0gdXNlcyBtb3ZpbmcgbWVkaWFuIGFzIG9wcG9zZWQgdG8gdGhlIG1lYW4sIHdoaWNoIGlzIHJvYnVzdCB0byB0aGUgcHJlc2VuY2Ugb2YgYW5vbWFsaWVzOyANCjIuIEVETSBjYW4gZGV0ZWN0IGJvdGggJ21lYW4gc2hpZnQnIChzdWRkZW4gY2hhbmdlKSBhbmQgJ3JhbXBpbmcnIChncmFkdWFsIGNoYW5nZSkgZm9yIG11bHRpcGxlIGNoYW5nZSBwb2ludHM7IA0KMy4gRURNIHRha2VzIGEgbm9uLXBhcmFtZXRyaWMgYXBwcm9hY2gsIG1lYW5pbmcgdGhlIG1vZGVsIHdpbGwgYWRhcHQgdG8gdGhlIGRhdGEncyB1bmRlcmx5aW5nIGRpc3RyaWJ1dGlvbiwgYW5kIHRoZXJlZm9yZSBjYW4gZGV0ZWN0IGRpc3RyaWJ1dGlvbiBjaGFuZ2U7DQo0LiBFRE0gaXMgZmFzdCwgYXMgaXQgdXNlcyBpbnRlcnZhbCB0cmVlcyB0byBlZmZpY2llbnRseSBhcHByb3hpbWF0ZSB0aGUgbWVkaWFuLiANCg0KVGhlIGFuYWx5c2lzIGlzIGltcGxlbWVudGVkIGluIGEgcHJvZ3JhbSB3cml0dGVuIGluIFIsIGFuZCB0aGUgRURNIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlICdCcmVha291dERldGVjdGlvbicgcGFja2FnZSBkZXZlbG9wZWQgYnkgVHdpdHRlciBlbmdpbmVlcnMuIE5vbi10cml2aWFsIHBhcmFtZXRlcnMgb2YgdGhlIEVETSBtb2RlbCBhcmUgY2FyZWZ1bGx5IHR1bmVkIHRvIGJlc3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG91dGNvbWUuIFRoaXMgYW5hbHlzaXMgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBhc3N1cmFuY2UgdG8gdGhlIGRhdGEgcXVhbGl0eS4gQWxzbywgZmllbGQgY3Jld3MgKG1vbml0b3JpbmcsIE9wZXJhdGlvbiAmIE1haW50ZW5hbmNlLCBldGMuKSBjYW4gcXVpY2tseSByZXNwb25kIHRvIHRoZSBpc3N1ZSBvbmNlIGEgYnJlYWtvdXQgaGFzIGJlZW4gZGV0ZWN0ZWQuIFRoaXMgYW5hbHlzaXMgaXMgYWxzbyBhcHBsaWNhYmxlIGZvciBvdGhlciBtb25pdG9yZWQgZGF0YSwgc3VjaCBhcyB0aGUgdHJ1bmsgYW5kIG91dGZhbGwgbGV2ZWxzIGF0IGRyYWluYWdlIHN5c3RlbSByZWd1bGF0b3JzLg0KDQojIyMgMSAgQkFDS0dST1VORA0KDQpUaGUgUGhpbGFkZWxwaGlhIFdhdGVyIERlcGFydG1lbnQgKFBXRCkgbWFpbnRhaW5zIGh5ZHJvbG9naWMgYW5kIGh5ZHJhdWxpYyBtb2RlbHMgb2YgdGhlIGNvbWJpbmVkIHNld2VyIGNvbGxlY3Rpb24gc3lzdGVtIGZvciBwbGFubmluZywgbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSBwdXJwb3Nlcy4gUFdEIHJlbGllcyBvbiB0aGVzZSBtb2RlbHMgdG8gZXZhbHVhdGUgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgZXhpc3RpbmcgYW5kIHByb3Bvc2VkIENTTyBjb250cm9sIG1lYXN1cmVzLiBFZmZvcnRzIGFyZSBiZWluZyBtYWRlIHRvIHJlZmluZSB0aGUgbW9kZWxzIGFuZCBpbXByb3ZlIHRoZWlyIGFjY3VyYWN5IGFzIHRoZSBwcm9ncmFtIHByb2dyZXNzZXMgZnJvbSBwbGFubmluZyB0byBpbXBsZW1lbnRhdGlvbiBwaGFzZXMuIFNpbmNlIHRoZSAyMDAwcywgUFdEIGhhcyBiZWVuIG1vbml0b3JpbmcgdGhlIHNld2VyYWdlIGxldmVsIGFuZCB2ZWxvY2l0eSBhdCBvdmVyIDQwMCBtYW5ob2xlcyBhY3Jvc3MgdGhlIGNpdHkgZm9yIHZhcmlvdXMgbW9kZWwgY2FsaWJyYXRpb24vdmFsaWRhdGlvbiB0YXNrcy4gRGF0YSBhcmUgbWVhc3VyZWQgYXQgMTUtbWludXRlIGludGVydmFsLCB3aGljaCBhcmUgY29sbGVjdGVkIGJpLXdlZWtseSBieSBjb250cmFjdG9yLg0KDQohW10oQmFzZW1hcHYxMGQgLSBQV0QuanBnKQ0KDQpEdWUgdG8gdGhlIGhpZ2ggc29saWQgY29udGVudCBpbiBzZXdhZ2UsIGxldmVsIGFuZCB2ZWxvY2l0eSBtZWFzdXJlbWVudHMgYXQgc2V3ZXIgcGlwZXMgbWF5IHN1ZmZlcmVkIGZyb20gYnJlYWtvdXRzIChtZWFuIHNoaWZ0LCByYW1wIHVwKSBvdmVyIHRoZSB0aW1lIGR1ZSB0byBzZW5zb3IgcmFnZ2luZywgY2xvZ2dpbmcsIG9yIHBpcGUgc3VyY2hhcmdpbmcsIGV0Yy4gQSBzdHJpbmdlbnQgUXVhbGl0eSBDb250cm9sIChRQykgcHJvdG9jb2wgaXMgY29uZHVjdGVkIGJlZm9yZSB0aGUgZGF0YSBjYW4gYmUgdXNlZCBmb3IgSHlkcm9sb2dpYyAmIEh5ZHJhdWxpYyBtb2RlbGluZyB0YXNrcy4gQXMgb25lIFFDIG1lYXN1cmUsIHRoZSB3YXRlciBsZXZlbCBhbmQgdmVsb2NpdHkgdGltZS1zZXJpZXMgYXJlIGV4YW1pbmVkIHRvIGRldGVjdCBhbnkgcG90ZW50aWFsIGJyZWFrb3V0LiBTaW5jZSBhIGJyZWFrb3V0IGlzbuKAmXQgYWx3YXlzIG9idmlvdXMgZHVlIHRvIHRoZSByYW5nZSBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWVzLCB2aXN1YWwgZGV0ZWN0aW9uIG9mIGJyZWFrb3V0cyBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIGFuZCB0aHVzIGEgcHJvZ3JhbW1hdGljIGFwcHJvYWNoIHRoYXQgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGJyZWFrb3V0cyBpcyBpbXBlcmF0aXZlLiANCg0KU2luY2UgZmxvdyBkYXRhIGF0IHNld2VyIHBpcGVzIGZsdWN0dWF0ZXMgd2l0aCByYWluZmFsbC1ydW5vZmYgZXZlbnRzLCB0aGUgcnVub2ZmIHJlc3BvbnNlIG1heSBpbnRlcmZlcmUgdGhlIGJyZWFrb3V0IGRldGVjdGlvbi4gVGhlcmVmb3JlLCB0aGUgYWxnb3JpdGhtIG11c3QgYmUgcm9idXN0IGFnYWluc3QgdGhlIHByZXNlbmNlIG9mIGFub21hbGllcy4NCg0KQWxzbywgZmllbGQgY3Jld3MgKG1vbml0b3JpbmcsIE9wZXJhdGlvbiAmIE1haW50ZW5hbmNlLCBldGMuKSBjYW4gcXVpY2tseSByZXNwb25kIHRvIHRoZSBpc3N1ZSBvbmNlIGEgYnJlYWtvdXQgaGFzIGJlZW4gZGV0ZWN0ZWQuIFRoaXMgYW5hbHlzaXMgaXMgYWxzbyBhcHBsaWNhYmxlIGZvciBvdGhlciBtb25pdG9yZWQgZGF0YSwgc3VjaCBhcyB0aGUgdHJ1bmsgYW5kIG91dGZhbGwgbGV2ZWxzIGF0IGRyYWluYWdlIHN5c3RlbSByZWd1bGF0b3JzLg0KDQojIyMgMiAgT0JKRUNUSVZFUw0KDQpNZWFzdXJlbWVudCBBY2N1cmFjeSBkZXRlcm1pbmVzIHRoZSBvdmVyYWxsIG1vZGVsIHF1YWxpdHkuIFRoaXMgc3R1ZHkgYWltcyB0byBkZXZlbG9wIGEgd29ya2Zsb3cgYXMgYSBRQSBtZWFzdXJlIGZvciBkZXRlY3RpbmcgYnJlYWtvdXRzIGluIGZsb3cgbW9uaXRvcmluZyBkYXRhIHV0aWxpemluZyBhIHNvdW5kIGNoYW5nZSBwb2ludCBkZXRlY3Rpb24gYWxnb3JpdGhtLiBGaXJzdCwgYSBzb3VuZCBicmVha291dCBkZXRlY3Rpb24gYWxnb3JpdGhtIGlzIHNlbGVjdGVkIGZyb20gc2V2ZXJhbCBzdGF0ZS1vZi1hcnQgbWV0aG9kcywgd2hlcmUgaXQgbXVzdCBtZXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQoNCi0gICBhYmxlIHRvIGRldGVjdCBtdWx0aXBsZSB0eXBlcyBvZiBjaGFuZ2UNCg0KLSAgIGFibGUgdG8gZGV0ZWN0IG11bGl0cGxlIGJyZWFrb3V0cyANCg0KLSAgIHdlYWsgb3Igbm8gYXNzdW1wdGlvbiBvbiBkYXRhIGRpc3RyaWJ1dGlvbg0KDQotICAgcm9idXN0IGFnYWluc3QgdGhlIHByZXNlbmNlIG9mIGFub21hbGllcw0KDQotICAgZmFzdCBvbiBsYXJnZSBkYXRhc2V0cywgcHJvZHVjZSByZWxpYWJsZSByZXN1bHRzIHwgbG93IGxhdGVuY3ksIGhpZ2ggcmVsaWFiaWxpdHkNCg0KTmV4dCwgdGhlIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGFyZSBjYXJlZnVsbHkgdHVuZWQgdG8gb3B0aW1pemUgdGhlIG91dGNvbWUuDQoNCkZpbmFsbHksIGFuIGFwcGxpY2F0aW9uIGlzIGRldmVsb3BlZCBpbiB0aGUgUiBzdGF0aXN0aWNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZSBmb3IgYW5hbHl6aW5nIHRoZSBsZXZlbCBhbmQgdmVsb2NpdHkgdGltZS1zZXJpZXMgYW5kIGdlbmVyYXRpbmcgYSBxdWFydGVybHkgcmVwb3J0LCB3aGljaCBpcyBleGVjdXRlZCBiaXdlZWtseSBhdXRvbWF0aWNhbGx5Lg0KDQoNCiMjIyAzICBNRVRIT0RPTE9HWQ0KIyMjIyAzLjEgIENoYW5nZSBwb2ludCBhbmFseXNpcw0KDQpJbiBzdGF0aXN0aWNzLCB0aGUgJ2JyZWFrb3V0IGRldGVjdGlvbicgYmVsb25ncyB0byB0aGUgY2hhbmdlIHBvaW50IGFuYWx5c2lzLCB3aGljaCBoYXMgYmVlbiB3aWRlbHkgcmVzZWFyY2hlZCBvdmVyIHRoZSBwYXN0IDUwIHllYXJzIGluIGEgd2lkZSB2YXJpZXR5IG9mIGZpZWxkcywgc3VjaCBhcyBmaW5hbmNlIChFZHdhcmRzIGV0IGFsIDIwMTIpLCBnZW5ldGljcyAoQ2hlbiBhbmQgR3VwdGEgMjAxMSksIGFuZCBzaWduYWwgcHJvY2Vzc2luZyAoQmFzc2V2aWxsZSAxOTg4KS4gQXMgd2UndmUgZW50ZXJlZCB0aGUgJ0JpZyBEYXRhJyBlcmEsIGl0IGhhcyBnYWluIGl0J3MgcG9wdWxhcml0eSBpbiBsb3cgbGF0ZW5jeSwgaGlnaCByZWxpYWJpbGl0eSBvbmxpbmUgYW5hbHl0aWNzIGZvciBjbG91ZCBkYXRhIChKYW1lcywgZXQgYWwuIDIwMTYpLg0KDQpBIGJyZWFrb3V0IGlzIHR5cGljYWxseSBjaGFyYWN0ZXJpemVkIGJ5IHR3byBzdGVhZHkgc3RhdGVzIGFuZCBhbiBpbnRlcm1lZGlhdGUgdHJhbnNpdGlvbiBwZXJpb2QuIE1hdGhlbWF0aWNhbGx5LCBmb3IgZGF0YSB6PHN1Yj4xPC9zdWI+LOKApix6PHN1Yj5uPC9zdWI+LCBpZiBhIGNoYW5nZXBvaW50IGV4aXN0cyBhdCDPhCwgdGhlbiB6PHN1Yj4xPC9zdWI+LOKApix6PHN1Yj7PhDwvc3ViPiBkaWZmZXIgZnJvbSB6PHN1Yj7PhCsxPC9zdWI+LOKApix6PHN1Yj5uPC9zdWI+IGluIHNvbWUgd2F5Lg0KDQpUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgY2hhbmdlLCBzdWNoIGFzIE1lYW4gc2hpZnQsIHdoaWNoIGlzIGEgc3VkZGVuIGp1bXAgaW4gdGhlIHRpbWUgc2VyaWVzOyBSYW1wIHVwL2Rvd24sIHdoaWNoIGlzIGEgZ3JhZHVhbCBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBtZXRyaWMgZnJvbSBvbmUgc3RlYWR5IHN0YXRlIHRvIGFub3RoZXI7IGRpc3RyaWJ1dGlvbiBjaGFuZ2UsIHdoaWNoIGlzIGEgY2hhbmdlIG9mIHRoZSBkYXRhIGRpc3RyaWJ1dGlvbi4gDQoNCkNoYW5nZSBwb2ludCBhbmFseXNpcyBtYWlubHkgYW5zd2VycyB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uczogDQoNCi0gICBkb2VzIGEgY2hhbmdlIHBvaW50IGV4aXN0cz8NCg0KLSAgIHdoZW4gZG9lcyB0aGUgY2hhbmdlIHBvaW50IGhhcHBlbj8NCg0KLSAgIHdoYXQgaXMgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgY2hhbmdlIHBvaW50Pw0KDQotICAgaG93IHN1cmUgaXMgdGhlIGNoYW5nZSBwb2ludD8NCg0KTnVtZXJvdXMgY2hhbmdlcG9pbnQgZGV0ZWN0aW9uIGFsZ29yaXRobXMgaGF2ZSBiZWVuIHdpZGVseSByZXNlYXJjaGVkIGluIHZhcmlvdXMgZmllbGRzIG9mIGluZHVzdHJpZXMgKFJvZGlvbm92IDIwMDUpLiANCg0KRGVwZW5kaW5nIG9uIHRoZSBkYXRhIGRpc3RyaWJ1dGlvbiBhc3N1bXB0aW9uLCBhIGJyZWFrb3V0IGRldGVjdGlvbiBhbGdvcml0aG0gZ2VuZXJhbGx5IGZhbGxzIGludG8gdHdvIGNhdGVnb3JpZXM6IA0KDQotICAgcGFyYW1ldHJpYzogVGhlIHBhcmFtZXRyaWMgYW5hbHlzaXMgYXNzdW1lcyB0aGF0IHRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb25zIGJlbG9uZyB0byBhIGZhbWlseSBvZiBkaXN0cmlidXRpb25zLiBDb21tb24gcGFyYW1ldHJpYyBtZXRob2RzIGFyZSBQRUxUIChLaWxsaWNrIGV0IGFsLCAyMDEyKSwgLi4uLA0KDQotICAgbm9uLXBhcmFtZXRyaWM6IGRvIG5vdCBtYWtlIGFzc3VtcHRpb24gb24gZGF0YSBkaXN0cmlidXRpb24gYW5kIHVzZSBkZW5zaXR5IGVzdGltYXRpb24gaW5zdGVhZC4gbm9uLXBhcmFtZXRyaWMgbWV0aG9kcyAoUG9obGVydCAyMDE4KSwgc3VjaCBhcyBFLWRpdmlzaXZlIChNYXR0ZXNvbiAmIEphbWVzIDIwMTIpLCAuLi4NCg0KQmFzZWQgb24gaXRzIGFwcGxpY2F0aW9uLCBhIGJyZWFrb3V0IGRldGVjdGlvbiBjYW4gYmUgZGVzaWduZWQgZm9yIA0KDQotICAgb25saW5lIGFuYWx5dGljczogdGhlIGRhdGEgaXMgc3RyZWFtaW5nIGludG8gdGhlIG1vZGVsOyANCg0KLSAgIG9mZmxpbmUgYW5hbHl0aWNzOiB0aGUgZGF0YSBhcmUgcHJvY2Vzc2VkIGluIGJhdGNoZXMuIA0KDQpTZXZlcmFsIFIgcGFja2FnZXMgYWxyZWFkeSBleGlzdHMgZm9yIGJyZWFrb3V0IGRldGVjdGlvbiwgZS5nLiwNCltSIHBhY2thZ2VzIGludHJvZHVjdGlvbl0gLS0tIGVjcCwgY3BtLCBjaGFuZ2Vwb2ludCwgcmVha291dERldGVjdGlvbiwgZXRjLg0KLSAgIGBlY3BgOiBlLWRpdmlzaXZlLCBlLWFnZ2xvbWV0cmljDQoNCi0gICBgY3BtYA0KDQotICAgYGNoYW5nZXBvaW50YCAoS2lsbGljayAmIEVja2xleSwgMjAxNCkNCg0KLSAgIGBCcmVha291dERldGVjdGlvbmA6IEVETQ0KICAgDQpNYW55IG9mIHRoZSBleGlzdGluZyB0ZWNobmlxdWVzIGhhdmUgbGltaXRhdGlvbiBpbiBhbmFseXppbmcgZmxvdyBkYXRhIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXkgYXJlIG5vdCByb2J1c3QgaW4gdGhlIHByZXNlbmNlIG9mIGFub21hbGllcywgYW5kIG1heSBub3Qgc3VpdGFibGUgZm9yIHRoaXMgc3R1ZHkuIA0KDQojIyMjICAzLjIgIEUtZGl2aXNpdmUgd2l0aCBtZWRpYW5zIChFRE0pDQoNCkVETSBpcyBhIG5vdmVsIHN0YXRpc3RpY2FsIHRlY2huaXF1ZSB0aGF0IGVtcGxveXMgZW5lcmd5IHN0YXRpc3RpY3MgKEUtZGl2aXNpdmUpIHRvIGRldGVjdCBkaXZlcmdlbmNlIG9mIG1lYW5zLiBUbyBiZSByb2J1c3QgYWdhaW5zdCB0aGUgcHJlc2VuY2Ugb2YgYW5vbWFsaWVzLCBFRE0gdXNlcyB0aGUgcm9sbGluZyBtZWRpYW4gYXMgYSBsb2NhbCBzbW9vdGhlciB0byB0aGUgcmF3IGRhdGEuDQpJbiBhZGRpdGlvbiwgRURNIGlzIGNhcGFibGUgb2YgZGV0ZWN0aW5nIG11bHRpcGxlIGNoYW5nZSBwb2ludHMuIA0KDQpFbmVyZ3kgc3RhdGlzdGljcyBjb21wYXJlcyB0aGUgZGlzdGFuY2VzIG9mIG1lYW5zIG9mIHR3byByYW5kb20gdmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gYSBsYXJnZXIgdGltZSBzZXJpZXMuIFRoZSBlLWRpdmlzaXZlIG1ldGhvZCByZWN1cnNpdmVseSBwYXJ0aXRpb25zIGEgdGltZSBzZXJpZXMgYW5kIHVzZXMgYSBwZXJtdXRhdGlvbiB0ZXN0IHRvIGRldGVybWluZSBjaGFuZ2UgcG9pbnRzLCBidXQgaXQgaXMgY29tcHV0YXRpb25hbGx5IGludGVuc2l2ZS4gVG8gb3ZlcmNvbWUgdGhpcywgRURNIHVzZXMgaW50ZXJ2YWwgdHJlZXMgdG8gZWZmaWNpZW50bHkgYXBwcm94aW1hdGUgdGhlIG1lZGlhbiwgYW5kIHRoZXJlZm9yZSBpcyBtdWNoIGZhc3RlciB0aGFuIEUtRGl2aXNpdmUuICANCg0KRURNIGNhbiBkZXRlY3QgdmFyaW91cyB0eXBlcyBvZiBjaGFuZ2UsIGluY2x1ZGluZyAnbWVhbiBzaGlmdCcgKHN1ZGRlbiBjaGFuZ2UpICwgJ3JhbXBpbmcnIChncmFkdWFsIGNoYW5nZSksIGFuZCBjaGFuZ2UgaW4gZGlzdHJpYnV0aW9ucy4gc2luY2UgRURNIGlzIG5vbi1wYXJhbWV0cmljLCBpdCBkb2Vzbid0IG1ha2UgYW55IGFzc3VtcHRpb24gYWJvdXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdGltZS1zZXJpZXMsIGluc3RlYWQsIGl0IGxlYXJuIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBhcyBhIHJlZmVyZW5jZS4gV2hlbiB0aGUgZGlzdHJpYnV0aW9uIHN1ZGRlbmx5IGNoYW5nZSBFRE0gY2FuIGRldGVjdCB0aGUgdmFyaWF0aW9uOyBUaGlzIGlzIGltcG9ydGFudCBzaW5jZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHByb2R1Y3Rpb24gZGF0YSBzZWxkb20gKGlmIGF0IGFsbCkgZm9sbG93cyB0aGUgY29tbW9ubHkgYXNzdW1lZCBub3JtYWwgZGlzdHJpYnV0aW9uIG9yIGFueSBvdGhlciB3aWRlbHkgYWNjZXB0ZWQgbW9kZWwuDQoNCkEgY29tcGFyc2lvbiAocmVmKSBzaG93cyB0aGF0IEVETSBvdXRwZXJmb3JtZWQgdGhlIFBFTFQgaW4gdGhlIG1ham9yaXR5IG9mIGRhdGEgc2V0cy4gRHVlIHRvIHRoZSB3ZWFrZXIgYXNzdW1wdGlvbiBpbiBFRE0sICBUaGUgc2lnbmlmaWNhbmNlIG9mIHRoZSBicmVha291dCBpcyBkZXRlcm1pbmVkIGJ5IHBlcm11dGF0aW9uIHRlc3QsIHdoZXJlIGRhdGEgZnJvbSB0aGUgdHdvIHRpbWUgc2VyaWVzIGFyZSBwZXJtdXRhdGVkIGEgZmluaXRlIG51bWJlciBvZiB0aW1lcywgYW5kIGhlbmNlIHRoZSBFRE0gdGFrZXMgbG9uZ2VyIHRvIGV4ZWN1dGUgdGhhbiB0aGUgUEVMVC4gSG93ZXZlciwgdGhlIEVETSBoYXMgc2hvd24gYSBjb21wYXJhYmxlIGVmZmljYWN5IHRoYW4gb3RoZXIgY2hhbmdlIHBvaW50IGFuYWx5c2lzIGFsZ29yaXRobXMuIEFjY29yZGluZyB0byB4eHh4ICgyMDE2KSwgRURNIGlzIDMuNXggZmFzdGVyIHRoYW4gdGhlIG90aGVyIHBvcHVsYXIgYWxnb3JpdGhtcy4NCg0KDQojIyMjICAzLjMgIEJyZWFrb3V0RGV0ZWN0aW9uIHBhY2thZ2UgaW4gUg0KDQpUaGUgRURNIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYEJyZWFrb3V0RGV0ZWN0aW9uYCwgd2hpY2ggaXMgYW4gb3Blbi1zb3VyY2UgUiBwYWNrYWdlIGRldmVsb3BlZCBieSBUd2l0dGVyIEVuZ2luZWVycyBhbmQgaGFzIGJlZW4gdXNlZCBmb3IgYW5hbHl6aW5nIG5ldHdvcmsgYnJlYWtvdXRzIG9uIGEgZGFpbHkgYmFzaXMgYXQgVHdpdHRlci4NCg0KVGhlIGJyZWFrb3V0KCkgaXMgdGhlIGRldGVjdG9yIGZ1bmN0aW9uLCB3aGljaCBjb250YWlucyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6DQoNClo6IFRoZSBpbnB1dCB0aW1lIHNlcmllcy4gVGhpcyBpcyBlaXRoZXIgYSBudW1lcmljIHZlY3RvciBvciBhIGRhdGEuZnJhbWUgd2hpY2ggaGFzICd0aW1lc3RhbXAnIGFuZCAnY291bnQnIGNvbXBvbmVudHMuDQptaW4uc2l6ZTogVGhlIG1pbmltdW0gbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBiZXR3ZWVuIGNoYW5nZSBwb2ludHMuDQptZXRob2Q6IGVpdGhlciAnYW1vYycgKEF0IE1vc3QgT25lIENoYW5nZSkgb3IgJ211bHRpJyAoTXVsdGlwbGUgQ2hhbmdlcykuIEZvciAnYW1vYycgYXQgbW9zdCBvbmUgY2hhbmdlIHBvaW50IGxvY2F0aW9uIHdpbGwgYmUgcmV0dXJuZWQuDQoNCmZvciBzaW5nbGUgY2hhbmdlIHBvaW50IChtZXRob2Q9J2Ftb2MnKToNCg0KYWxwaGE6IFRoZSBhbHBoYSBwYXJhbWV0ZXIgdXNlZCB0byB3ZWlnaHQgdGhlIGRpc3RhbmNlIGJldHdlZW4gb2JzZXJ2YXRpb25zLiBUaGlzIGlzIGEgcmVhbCBudW1iZXIgaW4gdGhlIGludGVydmFsICgwLDJdLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbHBoYT0yLg0KDQpleGFjdDogVGhpcyBmbGFnIGlzIGZvciBzZWxlY3RpbmcgdGhlIHVzZSBvZiB0cnVlIG1lZGlhbnMgKFRSVUUpIG9yIGFwcHJveGltYXRlIG1lZGlhbnMgKEZBTFNFKSB3aGVuIGRldGVybWluaW5nIGNoYW5nZSBwb2ludHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGV4YWN0PVRSVUUuDQoNCnNpZy5sdmw6IE9uY2UgYSBjaGFuZ2UgcG9pbnQgaXMgZm91bmQgaXRzIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpcyBkZXRlcm1pbmVkIHRocm91Z2ggYSBoeXBvdGhlc2lzIHRlc3QuIHNpZy5sdmwgc3BlY2lmaWVzIHRoZSBzaWduaWZpY2FuY2UgZm9yIHRoZSBoeXBvdGhlc2lzIHRlc3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHNpZy5sdmw9MC4wNS4NCg0KbnBlcm06IFRoZSBudW1iZXIgb2YgcGVybXV0YXRpb25zIHRvIHBlcmZvcm0gaW4gb3JkZXIgdG8gb2J0YWluIGFuIGFwcHJveGltYXRlIHAtdmFsdWUuIElmIG5wZXJtPTAgdGhlbiB0aGVuIHBlcm11dGF0aW9uIHRlc3QgaXMgbm90IHBlcmZvcm1lZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnBlcm09MC4NCg0KRm9yIG11bHRpcGxlIGNoYW5nZSBhbmFseXNpcyAobWV0aG9kPSdtdWx0aSIpOg0KDQpkZWdyZWU6IFRoZSBkZWdyZWUgb2YgdGhlIHBlbmFsaXphdGlvbiBwb2x5bm9taWFsLiBkZWdyZWUgY2FuIHRha2UgdGhlIHZhbHVlcyAwLCAxLCBhbmQgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZGVncmVlPTEuDQoNCmJldGE6IEEgcmVhbCBudW1iZXJlZCBjb25zdGFudCB1c2VkIHRvIGZ1cnRoZXIgY29udHJvbCB0aGUgYW1vdW50IG9mIHBlbmFsaXphdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIHBlbmFsaXphdGlvbiwgaWYgbmVpdGhlciAob3IgYm90aCkgYmV0YSBvciAoYW5kKSBwZXJjZW50IGFyZSBzdXBwbGllZCB0aGlzIGFyZ3VtZW50IHdpbGwgYmUgdXNlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYmV0YT0wLjAwOC4NCg0KcGVyY2VudDogQSByZWFsIG51bWJlcmVkIGNvbnN0YW50IHVzZWQgdG8gZnVydGhlciBjb250cm9sIHRoZSBhbW91bnQgb2YgcGVuYWxpemF0aW9uLiBUaGlzIHZhbHVlIHNwZWNpZmllcyB0aGUgbWluaW11bSBwZXJjZW50IGNoYW5nZSBpbiB0aGUgZ29vZG5lc3Mgb2YgZml0IHN0YXRpc3RpYyB0byBjb25zaWRlciBhZGRpbmcgYW4gYWRkaXRpb25hbCBjaGFuZ2UgcG9pbnQuIEEgdmFsdWUgb2YgMC4yNSBjb3JyZXNwb25kcyB0byBhIDI1JSBpbmNyZWFzZS4gcGVyY2VudCBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlLg0KDQojIyMgUkVTVUxUUw0KDQpBZnRlciBhIHRob3JvdWdoIGxpdGVyYXR1cmUgcmV2aWV3IGFuZCB0ZXN0aW5nIHdpdGggc2FtcGxlIGRhdGEsIHRoZSBFLURpdmlzaXZlIHdpdGggTWVkaWFucyAoRURNKSBhbGdvcml0aG0gaXMgYWRvcHRlZCBpbiB0aGlzIHN0dWR5Lg0KDQpCYXNlZCBvbiBhIHNlcmllcyBvZiB0ZXN0cyB1c2luZyBzYW1wbGUgZGF0YSwgdGhlIGJyZWFrb3V0KCkgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkOiANCg0KLSAgIFo6IFRoZSBxdWFydGVybHkgdGltZS1zZXJpZXMgYXZlcmFnZWQgYnkgdGhlIGhvdXIgaXMgdXNlZCBmb3IgYmV0dGVyIGVmZmljaWVuY3kNCg0KLSAgIG1pbi5zaXplOiBzZXQgdG8gMjQwLCB3aGljaCBtZWFucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdHdvIGNoYW5nZSBwb2ludHMgbXVzdCBiZSBhdCBsZWFzdCAxMCBkYXlzICgxMCBkYXlzIHggMjQgc2FtcGxlL2RheSA9IDI0MCBzYW1wbGVzKQ0KDQotICAgbWV0aG9kOiBzZXQgdG8gJ211bHRpJyBhcyBkZXRlY3RpbmcgbXVsdGlwbGUgYnJlYWtvdXRzIGlzIGRlc2lyZWQNCg0KLSAgIGRlZ3JlZTogc2V0IHRvIDEsIGxlYXZlIGFzIGRlZmF1bHQuDQoNCi0gICBiZXRhOiBzZXQgdG8gMC4wMDgsIGRldGVybWluZWQgYnkgZWxib3cgcGxvdA0KDQotICAgcGVyY2VudDogc2V0IHRvIDAuMTAgDQoNCkEgUiBtYXJrZG93biBkb2N1bWVudCBpcyBkZXZlbG9wZWQgdGhhdCBpbmNsdWRlcyBzY3JpcHRzIGZvciBicmVha291dCBkZXRlY3Rpb24sIHN1bW1hcml6ZSB0aGUgcmVzdWx0cywgYW5kIHBsb3QgYnJlYWtvdXRzIHdpdGggdGltZS1zZXJpZXMgZm9yIG11bHRpcGxlIHNpdGVzLiBUbyBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSwgcGFyYWxsZWwgY29tcHV0YXRpb24gaXMgdXRpbGl6ZWQuDQpUaGUgb3V0cHV0IGlzIGEgcXVhcnRlcmx5IHJlcG9ydCB0aGF0IGluY2x1ZGVzIGEgc3VtbWFyeSB0YWJsZSBvZiBicmVha291dHMsIGFuZCBoeWRyb2dyYXBocyBmb3IgYWxsIHNpdGVzIHdpdGggaHlldG9ncmFwaCBvdmVybGFpZC4gVGhlIHJlcG9ydCBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYmktd2Vla2x5IHdoZW4gZGF0YSBpcyB1cGRhdGVkLiBJbiB0aGUgZnV0dXJlLCBpdCdzIGV4cGVjdGVkIHRvIGJlIHVwZGF0ZWQgbW9yZSBmcmVxdWVudGx5IHdoZW4gcmVhbC10aW1lIGRhdGEgYmVjb21lcyBhdmFpbGFibGUuIA0KDQoNCkEgZmV3IGJyZWFrb3V0IGV4YW1wbGVzIGJhc2VkIG9uIHJlYWwgZGF0YSBhcmUgc2hvd24gaW4gRmlnLnh4eC4gYSkgc2hvd3MgYW4gDQpwb3NpdGl2ZSBjaGFuZ2UgaW4gbGV2ZWwgYW5kIGEgbmVnYXRpdmUgY2hhbmdlIGluIHZlbG9jaXR5IG5lYXIgQXVndXN0IDEsIDIwMTcsIGFuZCBpdCByZXNldHMgdG8gaXRzIG9yaWdpbmFsIHZhbHVlcyBuZWFyIEF1Z3VzdCAyMiwgMjAxNy4gIFRoaXMgaXMgdHlwaWNhbGx5IGNhdXNlZCBieSBwaXBlIHN1cmNoYXJnaW5nLiANCg0KIVtdKElBTEwtMDAwOF8xN1EzX3N1cmNoYXJnZS5wbmcpDQpiKSBzaG93cyBhIHN1ZGRlbiBkb3dud2FyZCBzaGlmdCBvbiBOb3ZlbWJlciAxMSwgMjAxNC4gVGhlIG9wcG9zaXRlIHRyZW5kIGlzIG9ic2VydmVkIGluIHRoZSBsZXZlbCBkYXRhLCBidXQgdGhlIGJyZWFrb3V0IHdhcyBub3QgZGV0ZWN0ZWQgc29tZWhvdy4gIA0KDQohW10oRDQ1LTAwMDAxNV8xNFE0X3NoaWZ0X2Rvd24ucG5nKQ0KDQoNCmMpIGZsdXNoaW5nIGVmZmVjdD8NCg0KIVtdKFRITC0wMDg1XzE2UTFfc3VyY2hhcmdpbmcucG5nKQ0KDQohW10oTEZMTF8wMDE1LnBuZykNCg0KbGltaXRhdGlvbjoNCg0KLSAgIGNhbm5vdCBkZXRlY3QgYnJlYWtvdXRzIGF0IGJvdGggZW5kcyBvZiB0aGUgdGltZS1zZXJpZXMNCg0KLSAgIGxhcmdlIHJ1bm9mZiByZXNwb25zZSBtYXkgYmUgaWRlbnRpZmllZCBhcyBicmVha291dHMNCg0KDQojIyMgQ09OQ0xVU0lPTlMNCiANCkVETSBpcyBwcm92ZW4gdG8gYmUgYSByZWxpYWJsZSwgZWZmZWN0aXZlLCBhbmQgZWZmaWNpZW50IGJyZWFrb3V0cyBkZXRlY3Rpb24gdGVjaG5pcXVlIGZvciBmbG93IG1vbml0b3JpbmcgZGF0YSAobGV2ZWwgJiB2ZWxvY2l0eSkgd2l0aCBwcm9wZXJseSB0dW5lZCBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0byBiZSBhcHBsaWNhYmxlIGZvciBvdGhlciBtb25pdGlvcmVkIHRpbWUtc2VyaWVzIGRhdGEsIHN1Y2ggYXMgb3V0ZmFsbCBsZXZlbHMgYXQgQ1NPIHJlZ3VsYXRvcnMuDQoNCkluIHRoaXMgc3R1ZHksIEEgUiBhcHBsaWNhdGlvbiB0aGF0IHV0aWxpemVzIEVETSBmb3IgYnJlYWtvdXQgZGV0ZWN0aW9uIGlzIGRldmVsb3BlZC4gVGhpcyBhbmFseXNpcyBwcm92aWRlcyBhIHF1YWxpdHkgY29udHJvbCB0byB0aGUgbW9kZWxpbmcgZGF0YSwgd2hpY2ggd291bGQgYmUgYmVuZWZpY2lhbCBmb3IgaW1wcm92aW5nIHRoZSBtb2RlbCBxdWFsaXR5LCBhbmQgcXVpY2tseSByZXNwb25kIHRvIGZpZWxkIGlzc3Vlcy4gVGhpcyBhbmFseXNpcyBpcyBhbHNvIGFwcGxpY2FibGUgZm9yIG90aGVyIG1vbml0b3JlZCBkYXRhLCBzdWNoIGFzIHRoZSB0cnVuayBhbmQgb3V0ZmFsbCBsZXZlbHMgYXQgZHJhaW5hZ2Ugc3lzdGVtIHJlZ3VsYXRvcnMuDQoNCiMjIyBSRUZFUkVOQ0UNCg0KSmFtZXMsIE5pY2hvbGFzIEEuLCBBcnVuIEtlamFyaXdhbCwgYW5kIERhdmlkIFMuIE1hdHRlc29uLiAiTGV2ZXJhZ2luZyBjbG91ZCBkYXRhIHRvIG1pdGlnYXRlIHVzZXIgZXhwZXJpZW5jZSBmcm9tIOKAmEJyZWFraW5nIEJhZOKAmTogVGhlIFR3aXR0ZXIgQXBwcm9hY2guIiBJbiBCaWcgRGF0YSAoQmlnIERhdGEpLCAyMDE2IElFRUUgSW50ZXJuYXRpb25hbCBDb25mZXJlbmNlIG9uLCBwcC4gMzQ5OS0zNTA4LiBJRUVFLCAyMDE2Lg0KDQpNYXR0ZXNvbiwgRGF2aWQgUy4sIGFuZCBKYW1lcywgTmljaG9sYXMgQS4gIkEgbm9ucGFyYW1ldHJpYyBhcHByb2FjaCBmb3IgbXVsdGlwbGUgY2hhbmdlIHBvaW50IGFuYWx5c2lzIG9mIG11bHRpdmFyaWF0ZSBkYXRhLiIgSm91cm5hbCBvZiB0aGUgQW1lcmljYW4gU3RhdGlzdGljYWwgQXNzb2NpYXRpb24gMTA5LCBuby4gNTA1ICgyMDE0KTogMzM0LTM0NS4NCg0KSmFtZXMsIE5pY2hvbGFzIEEuLCBhbmQgRGF2aWQgUy4gTWF0dGVzb24uICJlY3A6IEFuIFIgcGFja2FnZSBmb3Igbm9ucGFyYW1ldHJpYyBtdWx0aXBsZSBjaGFuZ2UgcG9pbnQgYW5hbHlzaXMgb2YgbXVsdGl2YXJpYXRlIGRhdGEuIiBhclhpdiBwcmVwcmludCBhclhpdjoxMzA5LjMyOTUgKDIwMTMpLg0KDQpFZHdhcmRzLCBSb2JlcnQgRC4sIE1hZ2VlLCBKb2huLCBhbmQgQmFzc2V0dGksIFcuSC5DLi4gIlRlY2huaWNhbCBhbmFseXNpcyBvZiBzdG9jayB0cmVuZHMiLiBDUkMgUHJlc3MsIDIwMTINCg0KSmllIENoZW4gYW5kIEFyanVuIEsgR3VwdGEuIFBhcmFtZXRyaWMgU3RhdGlzdGljYWwgQ2hhbmdlIFBvaW50IEFuYWx5c2lzOiBXaXRoIEFwcGxpY2F0aW9ucyB0byBHZW5ldGljcywgTWVkaWNpbmUsIGFuZCBGaW5hbmNlLiBTcHJpbmdlciwgMjAxMS4NCg0KTWljaCZlZ3JhdmU7bGUgQmFzc2V2aWxsZS4gRGV0ZWN0aW5nIGNoYW5nZXMgaW4gc2lnbmFscyBhbmQgc3lzdGVtc2Egc3VydmV5LiBBdXRvbWF0aWNhLCAyNCgzKTozMDnigJMzMjYsIDE5ODgNCg0KS2lsbGljaywgUmViZWNjYSwgYW5kIElkcmlzIEVja2xleS4gImNoYW5nZXBvaW50OiBBbiBSIHBhY2thZ2UgZm9yIGNoYW5nZXBvaW50IGFuYWx5c2lzLiIgSm91cm5hbCBvZiBzdGF0aXN0aWNhbCBzb2Z0d2FyZSA1OCwgbm8uIDMgKDIwMTQpOiAxLTE5DQoNClJlYmVjY2EgS2lsbGljaywgUGF1bCBGZWFybmhlYWQsIGFuZCBJQSBFY2tsZXkuIE9wdGltYWwgZGV0ZWN0aW9uIG9mIGNoYW5nZXBvaW50cyB3aXRoIGEgbGluZWFyIGNvbXB1dGF0aW9uYWwgY29zdC4gSm91cm5hbCBvZiB0aGUgQW1lcmljYW4gU3RhdGlzdGljYWwgQXNzb2NpYXRpb24sIDEwNyg1MDApOjE1OTDigJMxNTk4LCAyMDEyDQoNClJvZGlvbm92LCBTLiBOLiAiQSBicmllZiBvdmVydmlldyBvZiB0aGUgcmVnaW1lIHNoaWZ0IGRldGVjdGlvbiBtZXRob2RzLiIgTGFyZ2Utc2NhbGUgZGlzdHVyYmFuY2VzIChyZWdpbWUgc2hpZnRzKSBhbmQgcmVjb3ZlcnkgaW4gYXF1YXRpYyBlY29zeXN0ZW1zOiBjaGFsbGVuZ2VzIGZvciBtYW5hZ2VtZW50IHRvd2FyZCBzdXN0YWluYWJpbGl0eSAoMjAwNSk6IDE3LTI0Lg0KDQpQb2hsZXJ0LCBUaG9yc3Rlbi4gIk5vbi1wYXJhbWV0cmljIHRyZW5kIHRlc3RzIGFuZCBjaGFuZ2UtcG9pbnQgZGV0ZWN0aW9uLiIgQ0MgQlktTkQgNCAoMjAxOCkuDQo=